home *** CD-ROM | disk | FTP | other *** search
- tatic char SccsID[] = "@(#)matrix.c 1.2 11/7/88";
-
- #include "matrix.h"
-
- ATRIX
- mult(A, B, C)
- MATRIX A, B, C;
- {
- int i, j, k;
-
- MATRIX D;
-
- D = mnil();
-
- for (i = 0; i < 4; i++)
- for (j = 0; j < 4; j++) {
- D[i][j] = 0.;
- for (k = 0; k < 4; k++)
- D[i][j] += A[i][k] * B[k][j];
- }
- mass(D, C);
- mfree(D);
-
- return C;
- }
-
- ECTOR
- mult(a, B, c)
- VECTOR a, c;
- MATRIX B;
- {
- int i, k;
- VECTOR d;
- double s;
-
- d = vnil();
- for (i = 0; i < 4; i++) {
- s = 0.;
- for (k = 0; k < 4; k++)
- s += a[k] * B[k][i];
- d[i] = s;
- }
- vass(d,c);
- vfree(d);
- return c;
- }
-
- ECTOR
- add(a, b, c)
- VECTOR a, b, c;
- {
- int i;
-
- for (i = 0; i < 3; i++)
- c[i] = a[i] + b[i];
- return c;
- }
-
- ECTOR
- sub(a, b, c)
- VECTOR a, b, c;
- {
- int i;
-
- for (i = 0; i < 3; i++)
- c[i] = a[i] - b[i];
- return c;
- }
-
- bgmprint(A)
- MATRIX A;
- {
- int i, j;
-
- for (j = 0; j < 4; j++) {
- for (i = 0; i < 4; i++)
- fprintf(stderr,"%15g", A[j][i]);
- fprintf(stderr,"\n");
- }
- }
-
- print(A)
- MATRIX A;
- {
- int i, j;
-
- for (j = 0; j < 4; j++) {
- for (i = 0; i < 4; i++)
- printf("%15g", A[j][i]);
- printf("\n");
- }
- }
-
- bgvprint(V)
- VECTOR V;
- {
- int i, j;
-
- fprintf(stderr,"(");
- for (i = 0; i < 3; i++)
- fprintf(stderr,"%g,", V[i]);
- fprintf(stderr,"%g)\n", V[3]);
- }
-
- print(V)
- VECTOR V;
- {
- int i, j;
-
- printf("(");
- for (i = 0; i < 3; i++)
- printf("%g,", V[i]);
- printf("%g)\n", V[3]);
- }
-
- ECTOR
- ass(w, v)
- ECTOR v,w;
- {
- int i;
-
- for (i = 0; i < 4; i++)
- v[i] = w[i];
- return v;
- }
-
- ATRIX
- ass(A, B)
- MATRIX A, B;
- {
- int i;
-
- for (i = 0; i < 16; i++)
- B[0][i] = A[0][i];
- return B;
- }
-
- ATRIX
- init(p)
- double p;
- {
- double *q, *r;
- int i;
- MATRIX A;
-
- A = (MATRIX) dynamem(&A, sizeof(double), 2, 4, 4);
- r= *A;
- for (q = &p, i = 0; i < 16; i++)
- *r++ = *q++;
- return A;
- }
-
- ATRIX
- set(A, p)
- MATRIX A;
- double p;
- {
- double *q, *r;
- int i;
-
- r= *A;
- for (q = &p, i = 0; i < 16; i++)
- *r++ = *q++;
- return A;
- }
-
- ATRIX
- nil()
- {
- int i;
- MATRIX A;
- double *q;
-
- A = (MATRIX) dynamem(&A, sizeof(double), 2, 4, 4);
- q = *A;
- for (i = 0; i < 16; i++)
- *q++ = 0.0;
- return A;
- }
-
- ECTOR
- init(p)
- double p;
- {
- double *q;
- int i;
- VECTOR V;
-
- V = (VECTOR) dynamem(&V, sizeof(double), 1, 4);
- for (q = &p, i = 0; i < 4; i++)
- V[i] = *q++;
- return V;
- }
-
- ECTOR
- set(V, p)
- VECTOR V;
- double p;
- {
- double *q;
- int i;
-
- for (q = &p, i = 0; i < 4; i++)
- V[i] = *q++;
- return V;
- }
-
- ECTOR
- nil()
- {
- int i;
- VECTOR V;
-
- V = (VECTOR) dynamem(&V, sizeof(double), 1, 4);
- for (i = 0; i < 4; i++)
- V[i] = 0.0;
- return V;
- }
-
- ouble
- prod(v, w)
- VECTOR v, w;
- {
- return v[0] * w[0] + v[1] * w[1] + v[2] * w[2];
- }
-
- ECTOR
- prod(v, w, y)
- VECTOR v, w, y;
- {
- double x;
-
- y[0] = v[1] * w[2] - v[2] * w[1];
- y[1] = v[2] * w[0] - v[0] * w[2];
- y[2] = v[0] * w[1] - v[1] * w[0];
- y[3] = 1;
- return y;
- }
-
- ECTOR
- norm(v, w)
- VECTOR v, w;
- {
- double length;
- int i;
-
- length = sqrt(dprod(v, v));
- for (i = 0; i < 3; i++)
- w[i] = v[i] / length;
- w[3] = 1.;
-
- return w;
- }
-